home *** CD-ROM | disk | FTP | other *** search
/ Aminet 41 / Aminet 41 (2001)(Schatztruhe)[!][Feb 2001].iso / Aminet / gfx / edit / DiamondBOX.lha / DiamondBOX / developer / RAW_Loader.c < prev    next >
C/C++ Source or Header  |  2000-06-22  |  4KB  |  142 lines

  1. /*
  2. ** RAW_loader.cpp  -  Nikolaj Thygesen  -  21.  1998.
  3. ** Loader til fiktivt RAW-format. Bare lis'sem et eksempel
  4. ** =======================================================
  5. */
  6.  
  7. #include <dos/dos.h>
  8.  
  9. #include <proto/dos.h>
  10. #include <proto/exec.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13.  
  14. struct BitmapLoaderBase {
  15.   struct Library library;
  16. };
  17. #pragma libbase BitmapLoaderBase;
  18.  
  19. #include "basictype.h"
  20. #include "proto/BitmapLoader.h"
  21. #include "proto/DiamondBox.h"
  22.  
  23. /*
  24. ** Dette er LibBase til DiamondBOX's eget lille lib, der med tiden bliver lidt
  25. ** mere ordnet :o) Der er lidt kaos over det PT.
  26. */
  27. struct Library *DiamondBase;
  28.  
  29.  
  30. /*
  31. ** Denne struktur hjemmestrikkes til at indeholde de ting og sager man måtte
  32. ** behøve under læsningen af den enkelte filtype.
  33. */
  34. struct PebbleHandle {
  35.   unsigned linenumber, width;
  36.   ULONG stream;
  37. };
  38.  
  39.  
  40. /*
  41. ** Her læser vi en enkelt scanline og returnerer nummeret på den læste scanline,
  42. ** i intervallet: [0, height[, i "*lineno". En pointer til vores PebbleHandle
  43. ** ligger i "data", og bitmap data smides i "SLP".
  44. */
  45. enum RCode ASM LoaderScanline(
  46.   A0 struct PebbleHandle *data,
  47.   A1 PixelARGB *SLP,
  48.   A2 unsigned *lineno
  49. )
  50. {
  51.   *lineno = data->linenumber++;
  52.   FRead(data->stream, SLP, PIXELARGB_SZ * data->width, 1);
  53.   return Success;
  54. }
  55.  
  56.  
  57. /*
  58. ** Allokerer resourcer til læsning af bitmap.
  59. ** ==========================================
  60. */
  61. struct PebbleHandle *OpenLoader(
  62.   A0 char *filename,
  63.   A1 unsigned *picwidth,
  64.   A2 unsigned *picheight,
  65.   D0 struct Library *diamondlib
  66. )
  67. {
  68.   struct PebbleHandle *RC = NULL;
  69.   char ID[4];
  70.  
  71.   /*
  72.   ** For nemheds skyld overleveres en pointer til lokalt lib, som også kunne
  73.   ** åbnes. Det giver adgang til en række utility-funktioner. Nogle får er
  74.   ** allerede på nuværende tidspunkt ligegyldige.
  75.   */
  76.   DiamondBase = diamondlib;
  77.   /*
  78.   ** PebbleHandle SKAL allokeres med dertil indrettet funtion, og ligeledes
  79.   ** frigives med FreePebbleHandle(). Returværdi forskellig fra NULL angiver
  80.   ** succesfuld åbning af bitmap-fil.
  81.   */
  82.   if(RC = AllocPebbleHandle(sizeof(struct PebbleHandle))) {
  83.     if(RC->stream = (ULONG)Open(filename, MODE_OLDFILE)) {
  84.       FRead(RC->stream, ID, 4, 1);
  85.       /*
  86.       ** Bemærk at der ikke fejlmeddeles ifm. identifikation da vi elegant videre-
  87.       ** giver kontrollen til næste loader hvis det viser sig ikke at være vores
  88.       ** filtype. Vi forestiller os at de første fire bytes indeholder tegnene:
  89.       ** 'X', 'R', 'A' og 'W' efterfulgt af bredde, højde og selve bitmap.
  90.       */
  91.       if(!memcmp("XRAW", ID, 4)) {
  92.         FRead(RC->stream, picwidth, 4, 1);
  93.         FRead(RC->stream, picheight, 4, 1);
  94.         RC->linenumber = 0;
  95.         RC->width = *picwidth;
  96.         return RC;
  97.       }
  98.       Close(RC->stream);
  99.     }
  100.     else DumpError(RC_UNFOUNDFILE, filename);
  101.     FreePebbleHandle(RC);
  102.   }
  103.   else DumpError(RC_NOMEMORY, "PebbleHandle");
  104.   return NULL;
  105. }
  106.  
  107.  
  108. /*
  109. ** Denne lille finesse har endnu ikke fundet anvendelse, men den er rar at have
  110. ** hvis det nu skulle vise sig... Bemærk at CloseLoader() bliver kaldt efter
  111. ** AbortLoader(), så ikke noget med at lukke filer to gange.
  112. */
  113. void ASM AbortLoader(A0 struct PebbleHandle *data) {}
  114.  
  115.  
  116. /*
  117. ** Ikke de store overraskelser her :o)
  118. */
  119. void CloseLoader(A0 struct PebbleHandle *data)
  120. {
  121.   Close(data->stream);
  122.   FreePebbleHandle(data);
  123. }
  124.  
  125.  
  126. unsigned long ASM IdentifyLoader(A0 char *name)
  127. {
  128.   /*
  129.   ** Navnet på loaderen skal holdes på højest 30 tegn.
  130.   */
  131.   strcpy(name, "RAW loader");
  132.   return EXTERN_fileloader;
  133. }
  134.  
  135.  
  136. /*
  137. ** StormC++ linker kan ikke klare sig uden denne her :o(
  138. */
  139. void exit(int x) {}
  140.  
  141. /* End Of File.*/
  142.